#pragma once

#include "types.h"

namespace __detail
{
	template <size_t BITS>
	struct register_value;

#define CREATE_REGISTER_VALUE(BITS)				\
    template <>									\
    struct register_value<BITS> {				\
        using value_t = std::uint##BITS##_t;	\
    }

	CREATE_REGISTER_VALUE(8);
	CREATE_REGISTER_VALUE(16);
	CREATE_REGISTER_VALUE(32);
	CREATE_REGISTER_VALUE(64);

	template <size_t BITS>
	struct bits_wrap {
		constexpr static int value = BITS > 64 ? 128 : (BITS > 32 ? 64 : (BITS > 16 ? 32 : (BITS > 8 ? 16 : 8)));
	};

#undef CREATE_REGISTER_VALUE
}  // namespace __detail

template <size_t SIZE>
struct register_value: public __detail::register_value<__detail::bits_wrap<SIZE>::value> {};